#include<stdio.h>
using namespace std;

int a[100001];
int n;

int part(int a[],int l,int r){
    int pivot = a[l];    // 作为轴
    while(l<r){
        while(l<r&&a[r]>=pivot) r--;
        a[l]=a[r];
        while(l<r&&a[l]<=pivot) l++;
        a[r]=a[l];
    }
    a[l]=pivot;
    return l;
    
}
void quickSort(int a[],int l,int r){
    if(l<r){
    int x=part(a,l,r);
    quickSort(a,l,x-1);
    quickSort(a,x+1,r);
    }
}
    
    
    

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
        
    }
    quickSort(a,0,n-1);
    for(int i=0;i<n;i++){
        printf("%d ",a[i]);
    }
    
}

// #include<stdio.h>
// #include<stdlib.h>
// #define MAX 1000
// int h[MAX];
// int n;
// void swap(int x, int y){
//     int cnt=h[x];
//     h[x]=h[y];
//     h[y]=cnt;
// }
// void quick_sort(int l, int r){
//      //递归的终止情况
//     if(l >= r) return;
//     //第一步：分成子问题
//     int i = l - 1, j = r + 1, x = h[l + r >> 1];
//     while(i < j)
//     {
//         do i++; while(h[i] < x);
//         do j--; while(h[j] > x);
//         if(i < j) swap(i, j);
//     }62
//     //第二步：递归处理子问题
//     quick_sort(l, j), quick_sort(j + 1, r);
// }
// int main(){
//     int k=1;
//     FILE *fp,*fo;
//     fp=fopen("in.txt","r");
//     fo=fopen("out.txt","w");
//     fscanf(fp,"%d",&n);
//     while(n!=-1)
//     {
//         fprintf(fo,"Case %d : %d\n",k++,n);
//         // 读取 数列
//         for(int i=1;i<=n;i++)         
//         {
//             fscanf(fp,"%d",&h[i]); 
//         }
//         quick_sort(1,n);

//         for(int i=1;i<=n;i++)
//         {
//             fprintf(fo,"%d ",h[i]);
//         }
     

//         fprintf(fo,"\n");
//         fscanf(fp,"%d",&n);

//     }


//         fclose(fo);
//         fclose(fp);
    
// }

